package BinaryTree.CompleteBinaryTree;

import java.util.LinkedList;

public class CompleteBinaryTree {

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int value) {
            this.value = value;
        }
    }


    /**
     * 判断一棵树是不是完全二叉树
     *
     * @param head 头节点
     * @return
     */
    public static boolean isCBT(Node head) {
        if (head == null) {
            return true;
        }

        LinkedList<Node> queue = new LinkedList<>();

        // 记录是否遇到过左右两个孩子不双全的节点，默认为false
        boolean leaf = false;
        Node l = null;
        Node r = null;

        queue.add(head);

        // 在广度优先遍历的情况下，判断是否是完全二叉树
        while (!queue.isEmpty()) {
            // 是否遇到过左右两个孩子不双全的节点
            head = queue.poll();
            l = head.left;
            r = head.right;

            // 如果遇到了不双全的节点之后，有发现当前节点居然有孩子，则不是完全二叉树
            if ((leaf && (l != null || r != null))) {
                return false;
            }

            // 没有左节点但是有右节点也不是完全二叉树
            if ((l == null && r != null)) {
                return false;
            }

            if (l != null) {
                queue.add(l);
            }
            if (r != null) {
                queue.add(r);
            }

            // 当前节点是否两个节点都有
            if (l == null || r == null) {
                // 不是
                leaf = true;
            }
        }

        return true;
    }

}
